# 回调
# 回调是传递给模型以自定义和扩展其在训练期间的行为的对象。我们可以编写自己的自定义回调，或使用tf.keras.callbacks中的内置函数，常用内置回调函数如下：
#
# tf.keras.callbacks.ModelCheckpoint：定期保存模型的检查点。
# tf.keras.callbacks.LearningRateScheduler：动态更改学习率。
# tf.keras.callbacks.EarlyStopping：验证性能停止提高时进行中断培训。
# tf.keras.callbacks.TensorBoard：使用TensorBoard监视模型的行为 。
import tensorflow as tf

import numpy as np

from tensorflow import keras

from tensorflow.keras import layers

input_x = tf.keras.Input(72, )

hidden1 = layers.Dense(32, activation=tf.keras.activations.relu)(input_x)
hidden2 = layers.Dense(32, activation=tf.keras.activations.relu)(hidden1)
output = layers.Dense(10, activation=tf.keras.activations.softmax)(hidden2)

# 构建模型实力

model = tf.keras.Model(inputs=input_x, outputs=output)

model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
              loss=tf.keras.losses.categorical_crossentropy,
              metrics=['accuracy'])

train_x = np.random.random((1000, 72))
train_y = np.random.random((1000, 10))

val_x = np.random.random((200, 72))
val_y = np.random.random((200, 10))

# model.fit(train_x, train_y, batch_size=32, epochs=5)


callbacks = [
    tf.keras.callbacks.EarlyStopping(patience=2, monitor='val_loss'),
    tf.keras.callbacks.TensorBoard(log_dir='./logs')
]
model.fit(train_x, train_y, batch_size=16, epochs=50,
          callbacks=callbacks, validation_data=(val_x, val_y))
